package com.deer.wms.base.system.dao.box;


import com.deer.wms.base.system.model.box.*;
import com.deer.wms.base.system.model.task.TaskInfo;
import com.deer.wms.base.system.model.task.TaskInfoDto;
import com.deer.wms.base.system.model.ware.CellInfo;
import com.deer.wms.base.system.model.ware.CellInfoDto;
import com.deer.wms.base.system.model.zh.WorkTasks;
import com.deer.wms.common.core.commonMapper.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 组盘 数据层
 *
 * @author guo
 * @date 2019-06-03
 */
public interface BoxItemMapper extends Mapper<BoxItem> {
    /**
     * 入库更新时校验库存
     * @param boxItem
     * @return
     */
    BoxItem verifyBoxItem(BoxItem boxItem);

    /**
     * 查询盘点库存列表信息
     * @param criteria
     * @return
     */
    List<BoxItemDto> findTaskStockList(BoxItemCriteria criteria);

    /**
     * 导出盘点数据
     * @return
     */
    List<BoxItemDto> findTaskExportList();
    /**
     * 总记录数
     *
     * @return 库存总数
     */
    int BoxItemCount();


    /**
     * 工单备料的数量
     */
    int BoxItemByCountState();

    /**
     * 首页显示物料，以及对应的库存数，预警数
     *
     * @return
     */
    List<BoxItemDto> getBoxItemDtoInMain(BoxItemCriteria criteria);


    /**
     * 通过编码修改实发数
     *
     * @param boxItem 拿出托盘/料箱编码
     * @return 结果
     */
    public int updateBoxItemQuantity(BoxItem boxItem);

    /**
     * 关联查询托盘相关信息
     *
     * @return
     */
    public List<BoxItemDto> selectBoxItemDtoList(BoxItemCriteria boxItemCriteria);


    public List<BoxItemDto> findBoxItemDetail(BoxItemCriteria boxItemCriteria);

	/**
	 * 根据物料编码寻找所有在货位上的托盘信息  便于统计数据
	 *
	 * @param itemCode
	 * @return
	 */
	public List<BoxItemDto> getBoxItemDtoByitemCode(String itemCode);


    /**
     * 根据任务id查询托盘信息
     *
     * @param taskId
     * @return
     */
    public BoxItem getBoxItemByTaskId(String taskId);


    /**
     * 根据物料编码查询货位信息  (根据批次排序， 保证先进先出)
     *
     * @param itemCode
     * @return
     */
    public List<BoxItemDto> getFullCellInfoForOutOfStock(String itemCode);

    /**
     * 根据 托盘编码查找托盘
     *
     * @param boxCode
     * @return
     */
    public BoxItem getBoxItemByBoxCode(String boxCode);

    
    /***
     *出库时同步库存历史表查询
     * @author 李帅辰
     * @date 2020/10/23 15:51
     * @return com.deer.wms.base.system.model.box.BoxItemDto
     */
    BoxItemDto billOutGetBoxItemByBoxCode(String boxCode);
    /**
     * 根据数量(数量==0)查询空货位用于入库
     *
     * @param
     * @return
     */
    public BoxItemDto getFreeCellInfoForBillIn();


    /**
     * 查询组盘信息
     *
     * @param id 组盘ID
     * @return 组盘信息
     */
    public BoxItemDto selectBoxItemById(Integer id);

    /**
     * 查询组盘列表
     *
     * @param boxItem 组盘信息
     * @return 组盘集合
     */
    public List<BoxItem> selectBoxItemList(BoxItem boxItem);

    /**
     * 新增组盘
     *
     * @param boxItem 组盘信息
     * @return 结果
     */
    public int insertBoxItem(BoxItem boxItem);


    /**
     * 修改组盘
     *
     * @param boxItem 组盘信息
     * @return 结果
     */
    public int updateBoxItem(BoxItem boxItem);

    /**
     * 删除组盘
     *
     * @param id 组盘ID
     * @return 结果
     */
    public int deleteBoxItemById(Long id);

    void deleteByBoxCode(@Param("boxCode") String boxCode);

    /**
     * 批量删除组盘
     *
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    public int deleteBoxItemByIds(String[] ids);

    /**
     * 根据id升序查找第一个可合框物料
     */
    BoxItem findOneCombineBoxGroupByItemCodeAndBatch();

    /**
     * 根据物料编码与批次查询多条可合框货位
     */
    List<BoxItemDto> findMoreCombineBoxByItemCodeAndBatch(BoxItem boxItem);

    List<BoxItemDto> findByWorkerOrder(BoxItemCriteria criteria);


    List<BoxItemDto> findList(BoxItemCriteria criteria);

    List<BoxItemDto> findSluggishOverdue(BoxItemCriteria criteria);

    List<BoxItemDto> findWillOverdue(BoxItemCriteria criteria);

    List<BoxItemDto> findBoxItemList(BoxItemCriteria criteria);

    List<BoxItemDto> workerOrderLackOut(BoxItemCriteria criteria);

    List<UnqualifiedOverTakeCanDelayDays> findUnqualifiedOverTakeCanDelayDays(BoxItemCriteria criteria);

    /**
     * 出库消息时查询
     *
     * @param
     * @return
     */
    List<BoxItemDto> findListByItemCode(BoxItemDto boxItemDto);
    /***
     *指定货位时查询
     * @author 李帅辰
     * @date 2020/10/15 11:49 
     * @return com.deer.wms.base.system.model.box.BoxItemDto
     */
    BoxItemDto assignBillOutFindBoxCode(BoxItemDto boxItemDto);
    /**
     * 出库时判读物料库存
     *
     * @param boxItem
     * @return
     */
    Integer getSumQuantityByItemCode(BoxItem boxItem);

    /**
     * 出库时查询托盘具体的存放位置 1.0
     *
     * @param boxCode
     * @return
     */
    BoxItemDto selectBoxItemByBoxCode(String boxCode);

    /**
     * 出库发消息时查询需要的消息内容
     * @param boxItemDto
     * @return
     */
    BoxItemDto selectBoxItemByboxItemDto(BoxItemDto boxItemDto);

    List<StockOverviewDto> findStockOverviewList(StockOverviewDto stockOverviewDto);

    List<StockOverViewDo> findExportList();

    List<String> findStockOverviewItemCode();
    /***
     *指定货位出库时查询托盘，货位
     * @author 李帅辰
     * @date 2020/10/14 11:15
     * @return java.util.List<com.deer.wms.base.system.model.box.BoxItemDto>
     */
    List<BoxItemDto> assignBoxItem(BoxItemDto boxItemDto);


    int selectSumQuantityByItemCode(String itemCode);

    List<BoxItem> findBoxItemByCarrierId(BoxItemCriteria boxItemCriteria);
    
    /**
     *通过托号查询库存id
     * @author 李帅辰
     * @date 2021/6/25 9:48
     * @return com.deer.wms.base.system.model.box.BoxItem
     */
    BoxItem findIdByCarrierId(@Param("carrierId") String carrierId);

    List<BoxItemDto> getQuantityByShelfId(@Param("shelfId") Integer shelfId);
    
    /**
     *通过货区ID 查询库存信息
     * @author 李帅辰
     * @date 2021/6/25 19:48 
     * @return java.util.List<com.deer.wms.base.system.model.box.BoxItemDto>
     */
    List<BoxItemDto> findBoxItemDtoListByAreaId(BoxItemCriteria boxItemCriteria);

    List<BoxItemExport> findBoxItemDtoMainListByAreaId(BoxItemCriteria boxItemCriteria);


    List<BoxItemDto> selectRevolutionStorageList(BoxItemCriteria boxItemCriteria);


    
    /**
     *库存总览
     * @author 李帅辰
     * @date 2021/6/27 12:29 
     * @return java.util.List<com.deer.wms.base.system.model.box.BoxItemDto>
     */
    List<BoxItemDto> boxPandect(BoxItemCriteria boxItemCriteria);

    List<BoxItemDto> findBoxItemDtoDetailByAreaId(BoxItemCriteria boxItemCriteria);

    /*库存总览*/
    List<BoxItemDto> selectBoxItem(BoxItemDto boxItemDto);

    /*库存明细*/
    List<BoxItemDto> selectBoxItemDetail(BoxItemDto boxItemDto);
    /*根据任务号查询入库明细*/
    List<BoxItemDto> findBoxItemMsgByTaskNumber(WorkTasks workTasks);
    /*冻结库存*/
    int blockedBoxItem(Long id);
    /*解冻库存*/
    int unfreezeBoxItem(Long id);
    /*线边仓列表*/
    List<BoxItemDto> selectBoxItemLine(BoxItemDto boxItemDto);
    /*查询物料的商家构成*/
    List<BoxItemDto> findBoxItemByItemId(Integer itemId);
    /*新增线边仓*/
    void insertBoxItemEdge(BoxItemDto boxItem);
    /*根据任务号添加托盘货位*/
    void saveBoxItemByTaskNumber(TaskInfo taskInfo);
    /*手工单审核入库解冻*/
    void updateBySapId(Integer billInSapId);
    /*根据唯一流水批号,减少线边仓库存*/
    void updateBoxItemEdgeByBatch(WorkTasks workTasks);
    /*根据明细id修改托盘重量*/
    void updatetBoxItemByDetailId(BoxItem boxItem);
    /*查询库房所有批次*/
    List<BoxItemDto> findBoxItemBatch();

    List<CellInfo> findPai(CellInfo cellInfo);
    List<CellInfo> findLie(CellInfo cellInfo);
    List<CellInfo> findCeng(CellInfo cellInfo);
    List<CellInfo> findCell(CellInfo cellInfo);
    /*根据托盘id查库位*/
    CellInfoDto findCellById(Integer id);
    /*更改托盘货位*/
    void updateBoxItemCell(BoxItemDto boxItemDto);
    /*移库成功,解冻托盘*/
    void updateBoxItemState(String cellCode);
    /*查询剩余重量*/
    Float findBoxItemEdgeByBatch(WorkTasks workTask);
    /*删除消耗完的物料*/
    void delBoxItem(WorkTasks workTask);

    int findEdgeSumByBatch(WorkTasks workTask);

    /*质量转换*/
    void updateBillInState(BoxItemDto boxItem);
    /*批次转换*/
    void updateBatch(BoxItemDto boxItem);
    /*查托盘id*/
    BoxItemDto findBoxItemMSG(Long id);
    /*创建质量转换单*/
    void insertBoxItemState(BoxItemState boxItemState);
    /*创建质量转换明细*/
    void insertBoxItemStateDetail(BoxItemStateDetail boxItemStateDetail);
    /*质量转换记录单*/
    List<BoxItemStateDetail> selectBoxItemStateList(BoxItemStateDetail boxItemStateDetail);
    /*质量转换*/
    BoxItemState findStateById(Integer stateId);
    /*根据id查质量转换单明细*/
    List<BoxItemStateDetail> findListdetail(Integer stateId);
    /*找批次*/
    List<BoxItemDto> findBoxBatchByItemId(Integer itemId);
    /*前往线边仓*/
    void outBoxItem(Long id);
    /*修改批次单*/
    void insertBoxItemBatch(BoxItemBatch boxItemBatch);
    /*修改批次明细*/
    void insertBoxItemBatchDetail(BoxItemBatchDetail boxItemBatchDetail);
    /*查询批次转换列表*/
    List<BoxItemBatchDetail> selectBoxItemBatchList(BoxItemBatchDetail boxItemBatchDetail);

    /*导出批次转换列表*/
    BoxItemBatchDetail selectBoxItemBatch(int id);
    /*修改已导出状态*/
    void updateExcelBatchState(int id);
    /*导出质量转换列表*/
    BoxItemStateDetail selectBoxItemState(int id);
    /*修改质量已导出状态*/
    void updateExcelStateState(int id);

    List<BoxItemDto> selectBoxItemWarning(BoxItemDto boxItemDto);
    /*日结库存*/
    List<BoxItemToday> selectBoxItemToday(BoxItemToday boxItemToday);
    /*指定出库查物料*/
    List<BoxItemDto> findBoxItemAll(BoxItemDto boxItemDto);
    /*日报表查询历史*/
    List<BoxItemToday> selectBoxItemHistory(BoxItemToday boxItemToday);
    /*根据id查托*/
    BoxItemDto findByItemId(Long id);
    /*库存明细合计*/
    BoxItemDto selectBoxItemAll(BoxItemDto boxItemDto);
}
